﻿using CPF;
using CPF.Animation;
using CPF.Charts;
using CPF.Controls;
using CPF.Drawing;
using CPF.Shapes;
using CPF.Styling;
using CPF.Svg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CPFManager
{
    [CPF.Design.DesignerLoadStyle("res://CPFManager/Stylesheet1.css")]//用于设计的时候加载样式
    public class TreeViewItemTemplate : TreeViewItem
    {
        protected override void InitializeComponent()
        {
            //模板定义
            if (!string.IsNullOrWhiteSpace(DisplayMemberPath))
            {
                var b1 = this[nameof(Header)] <= DisplayMemberPath;
            }
            if (!string.IsNullOrWhiteSpace(ItemsMemberPath))
            {
                var b2 = this[nameof(Items)] <= ItemsMemberPath;
            }
            var panel = ItemsPanel.CreateElement();
            panel.Name = "itemsPanel";
            panel.PresenterFor = this;
            panel.MarginLeft = 20;
            //var bb = panel[nameof(Visibility)] <= this[nameof(IsExpanded), a => (bool)a ? Visibility.Visible : Visibility.Collapsed];
            panel[nameof(Visibility)] = (this, nameof(IsExpanded), a => (bool)a ? Visibility.Visible : Visibility.Collapsed);
            Children.Add(new StackPanel
            {
                PresenterFor = this,
                Name = "panel",
                MarginLeft = 0,
                Orientation = Orientation.Vertical,
                Children =
                {
                    new StackPanel
                    {
                        Name="treeViewItem",
                        PresenterFor=this,
                        MarginLeft=0,
                        Orientation= Orientation.Horizontal,
                        Children=
                        {
                            new Polygon
                            {
                                IsAntiAlias=true,
                                MarginLeft=3,
                                MarginTop=5,
                                Width=12,
                                RenderTransformOrigin=new PointField("30%","70%"),
                                Points=
                                {
                                    new Point(2,2),
                                    new Point(2,10),
                                    new Point(6,6),
                                },
                                Bindings=
                                {
                                    {
                                        nameof(Polygon.RenderTransform),
                                        nameof(IsExpanded),
                                        3,
                                        BindingMode.OneWay,
                                        a=>(bool)a?new RotateTransform(45):Transform.Identity
                                    },
                                    {
                                        nameof(Visibility),
                                        nameof(HasItems),
                                        3,
                                        BindingMode.OneWay,
                                        a=>(bool)a?Visibility.Visible:Visibility.Collapsed
                                    }
                                },
                                Commands=
                                {
                                    {
                                        nameof(MouseDown),
                                        (s,e)=>
                                        {
                                            ((RoutedEventArgs)e).Handled = true;
                                            IsExpanded = !IsExpanded;
                                        }
                                    }
                                },
                                Triggers=
                                {
                                    new Trigger
                                    {
                                        Property=nameof(IsMouseOver),
                                        Setters =
                                        {
                                            {
                                                nameof(Shape.StrokeFill),
                                                "4,124,205"
                                            }
                                        }
                                    }
                                }
                            },
                            new ContentControl
                            {
                                MarginLeft=3,
                                Bindings=
                                {
                                    {
                                        nameof(ContentControl.Content),
                                        nameof(TreeViewItem.Header),
                                        3
                                    },
                                    {
                                        nameof(ContentControl.ContentTemplate),
                                        nameof(TreeViewItem.HeaderTemplate),
                                        3
                                    }
                                }
                            }
                        },
                        Triggers=
                        {
                            new Trigger
                            {
                                Property = nameof(IsMouseOver),
                                PropertyConditions = a => (bool)a && !IsSelected,
                                Setters =
                                {
                                    {
                                        nameof(Background),
                                        "232,242,252"
                                    }
                                }
                            },
                        },
                        Commands=
                        {
                            {
                                nameof(MouseDown),
                                (s,e)=>
                                {
                                    SingleSelect();
                                }
                            },
                            {
                                nameof(DoubleClick),
                                (s,e)=>
                                {
                                    ((RoutedEventArgs)e).Handled = true;
                                    IsExpanded = !IsExpanded;
                                }
                            }
                        },
                    },
                    IsExpanded? panel:null,//如果还未展开，则先不加载，提高加载速度
                },
            });
            Children.Add(new Line
            {
                //竖线
                IsAntiAlias = true,
                UseLayoutRounding = true,
                StrokeStyle = new Stroke(1, DashStyles.Dot),
                IsHitTestVisible = false,
                StartPoint = new Point(1, 5),
                EndPoint = new Point(1, 50),
                MarginLeft = 7,
                MarginTop = 12,
                Bindings =
                {
                    {
                        nameof(Visibility),
                        nameof(LineVisibility),
                        this
                    },
                    {
                        nameof(EndPoint),
                        nameof(EndPoint),
                        this
                    }
                },
            });
            Children.Add(
            new Line
            {
                StartPoint = new Point(0, 10),
                EndPoint = new Point(15, 10),
                MarginLeft = -11,
                IsHitTestVisible = false,//IsAntiAlias = true,
                UseLayoutRounding = true,
                StrokeStyle = new Stroke(1, DashStyles.Dot),
                Bindings =
                {
                    {
                        nameof(Visibility),
                        nameof(HLineVisibility),
                        this
                    }
                }
            });
            this.Triggers.Add(new Trigger
            {
                Property = nameof(IsSelected),
                PropertyConditions = a => (bool)a,
                TargetRelation = Relation.Me.Find(a => a.Name == "treeViewItem" && a.PresenterFor == this),
                Setters =
                {
                    {
                        nameof(Background),
                        "153,201,239"
                    }
                }
            });
            Commands.Add(nameof(HasItems), (s, e) => SetLineVisibility());
            Commands.Add(nameof(IsExpanded), (s, e) => SetLineVisibility());
        }

        [PropertyChanged(nameof(IsExpanded))]
        void OnIsExpanded(object newValue, object oldValue, PropertyMetadataAttribute attribute)
        {
            var itemsPanel = FindPresenterByName<Panel>("itemsPanel");
            if ((bool)newValue && itemsPanel && itemsPanel.Root == null)
            {
                FindPresenterByName<Panel>("panel").Children.Add(itemsPanel);
            }
        }

        protected override void OnLayoutUpdated()
        {
            base.OnLayoutUpdated();
            if (Items.Count > 0)
            {
                EndPoint = new Point(1, (ItemsHost.Children[Items.Count - 1]).ActualOffset.Y + 20);
            }
            else
            {
                EndPoint = new Point(1, ActualSize.Height - 23);
            }
            HLineVisibility = (ParentItem is TreeViewItem) ? Visibility.Visible : Visibility.Collapsed;
        }

        public Point EndPoint
        {
            get { return GetValue<Point>(); }
            set { SetValue(value); }
        }

        [PropertyMetadata(Visibility.Collapsed)]
        public Visibility LineVisibility
        {
            get { return GetValue<Visibility>(); }
            set { SetValue(value); }
        }
        [PropertyMetadata(Visibility.Collapsed)]
        public Visibility HLineVisibility
        {
            get { return GetValue<Visibility>(); }
            set { SetValue(value); }
        }

        void SetLineVisibility()
        {
            if (HasItems && IsExpanded)
            {
                LineVisibility = Visibility.Visible;
            }
            else
            {
                LineVisibility = Visibility.Collapsed;
            }
        }
    }
}
